<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>02-受控组件</title>
  </head>
  <body>
    <div id="app"></div>

    <!-- 导入 react 主库 -->
    <script src="../js/react.development.js"></script>
    <!-- 导入 reactDom 扩展库 -->
    <script src="../js/react-dom.development.js"></script>
    <!-- 导入 babel 用于将jsx转为js -->
    <script src="../js/babel.min.js"></script>
    <!-- 导入 prop-types 用于对组件标签属性进行限制 -->
    <script src="../js//prop-types.js"></script>

    <script type="text/babel">
      // 定义类组件  受控组件避免用 ref 操作dom
      class Login extends React.Component {

        /*
        *  高阶函数：如果一个函数符合下面2个规范中的任何一个，name该函数就是高阶函数
        *           1. 若A函数，接收的参数是一个函数，那么A就可以称为高阶函数
        *           2. 若A函数，调用的返回值依然是一个函数，那么A既可以称之为高阶函数
        *           常见的高阶函数有： Promise、setTimeout、 arr.map() 等等
        * 
        *  函数的柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后同意处理的函数编码形式
        */

        state = {
            username: '',
            password: ''
        }

        // 收集表单数据
        saveFormData = (dataType) => {
            // onChange需要的是一个回调函数加小括号相当于直接调用了函数把返回值给了onChange
            return (event) => {
                this.setState({[dataType]: event.target.value})
            }
        }

        // 提交表单事件
        handlerSubmit = (event) => {
            console.log(event);  // 这种方法可以拿到当前事件绑定的dom元素
            event.preventDefault()  // 阻止表单的默认提交   
            const {username, password} = this.state
            alert(`用户名：${username}  密码：${password}`)
        }

        render() {
          return (
            <form action="http://www.try0317.com" onSubmit={this.handlerSubmit}>
              用户名：<input onChange={this.saveFormData('username')} type="text" name="username" id="" />
              密码：<input onChange={this.saveFormData('password')} type="password" name="password" id="" />
              <button>登录</button>
            </form>
          );
        }
      }
      ReactDOM.render(<Login />, document.getElementById("app"));
    </script>
  </body>
</html>
